package com.zhuchang.self_rpc.test.democoding;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;

/**
 * @Author RenPu
 * @Date 2022/2/8 14:56
 * @Version 1.0
 * @Description: 实现NIO 零拷贝客户端端
 **/
public class NewIOClient {


    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel =  SocketChannel.open();


        //      Socket socket = socketChannel.socket();

//设置setTcpNoDelay为false时, 就会开启Nagle算法：将通信中小数据包收集起来，组成一个大数据包一次发送出去，
// 优点避免大量的小包,频繁传递引起网络拥塞，缺点就是数据会影响数据的时效性
//设置setTcpNoDelay为true时,就会关闭Nagle算法 ，将数据包立马通过网络传输发送出去
//      socket.setTcpNoDelay(false);

//设置setKeepAlive为true，可以避免客户端，服务端有一方断开连接，导致另一端无感知
//导致被断开端一直保存着网络连接资源，当设置为true时，周期为2小时内如果双方没有任何的通信
//此时会发送一个探测包，根据探测包的结果进行决定是保持连接，断开连接，重新连接
//     socket.setKeepAlive(true);

// socketChannel.configureBlocking(false);
        socketChannel.connect(new InetSocketAddress(7001));

        String fileName="C:\\Users\\12795\\Desktop\\报文.txt";
        FileChannel channel = new FileInputStream(fileName).getChannel();
        long startTime = System.currentTimeMillis();


        //在 linux 下一个 transferTo 方法就可以完成传输
        //在 windows 下一次调用 transferTo 只能发送 8m, 就需要分段传输文件,而且要主要
        //传输时的位置=》课后思考...
        //transferTo 底层使用到零拷贝

       long transferCount = channel.transferTo(0,channel.size(),socketChannel);
        System.out.println("发送的总的字节数 = " + transferCount + " 耗时: " + (System.currentTimeMillis() - startTime));

        channel.close();

    }





}
